//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1999  Microsoft Corporation

Module Name:

command.h

Abstract:


Notes:


--*/


#pragma once

//
// Forward declarations
//
class CRilInstanceHandle;
class CNotificationData;
enum APIID;

//
// Command options
//
#define CMDOPT_NONE                     0x00000000
#define CMDOPT_IGNORERSP                0x00000001
#define CMDOPT_INIT                     0x00000002
#define CMDOPT_REINIT                   0x00000004
#define CMDOPT_HANGUP                   0x00000008
#define CMDOPT_DIAL                     0x00000010
#define CMDOPT_ANSWER                   0x00000020
#define CMDOPT_GENERALINIT              0x00000040
#define CMDOPT_SMSINIT                  0x00000080
#define CMDOPT_NOOP                     0x00000100
#define CMDOPT_REQUIRECONNECTRSP        0x00000200
#define CMDOPT_FINALINIT                0x00000400
#define CMDOPT_RETRYONSIMLOCKED         0x00000800
#define CMDOPT_IGNORERADIOOFF           0x00001000
#define CMDOPT_SETRADIOON               0x00002000
#define CMDOPT_SIMQUERY                 0x00004000
#define CMDOPT_DELAYCONNECTRSP          0x00008000
#define CMDOPT_LONGDIALSTRING           0x00010000
#define CMDOPT_SUPPRESSLOGGING          0x00020000
#define CMDOPT_UNLOCKING                0x00040000
#define CMDOPT_POLLING                  0x00080000
#define CMDOPT_CPINENTERED              0x00100000
#define CMDOPT_SIMPBINIT                0x00200000
#define CMDOPT_INTERMEDIATERESPONSE     0x00400000
#define CMDOPT_FORCEPARSE               0x00800000
#define CMDOPT_DEACT                    0x01000000
#if 0
#define CMDOPT_NVFLAG                   0x02000000
#define CMDOPT_HCITMODEFLAG             0x04000000
#define CMDOPT_LEDFLAG                  0x08000000
#define CMDOPT_LOOPBACKFLAG             0x10000000
#define CMDOPT_BANDFLAG                 0x20000000
#endif
//
// Command priorities
//
#define CMDPRI_HIGHEST                  0
#define CMDPRI_HIGH                     1
#define CMDPRI_NORMAL                   2
#define CMDPRI_LOW                      3

//
// Parsing callback stored in CCommand
//
typedef HRESULT (*PFN_CMD_PARSE)(LPCSTR szRsp, void*& pBlob, UINT& cbBlob);
typedef HRESULT (*PFN_CMD_PARSE_DATA)(LPCSTR szRsp, void*& pBlob, UINT& cbBlob, PVOID& pfnParseData);


//
// AT command
//
class CCommand : public CListElem
{
public:
            CCommand();
            ~CCommand();

    BOOL                Init(CRilInstanceHandle* const pHandle, const LPCSTR szCmd, const LPCSTR szCmdPart2, const DWORD dwOptions,
                             const DWORD dwExecTime, const DWORD dwTimeout, CNotificationData* const pnd,
                             const PFN_CMD_PARSE pfnParse, const DWORD dwRetries, 
                             const DWORD dwRetriesOnError, const DWORD dwRetryOnErrorDelay, const APIID apiid, const PFN_CMD_PARSE_DATA pfnParseWithData, const PVOID pParseData );
    BOOL                Init(CCommand* pCmd);
    void                SendResponse(const DWORD dwResponseCode, const void* const pBlob, const UINT cbBlob) const;
    void                SendNotification(const DWORD dwNotifyCode, const void* const pBlob, const UINT cbBlob) const;
    CRilInstanceHandle* GetHandle() const           { return m_pHandle; };
    LPSTR               GetCmd() const              { return m_szCmd; };
    LPSTR               GetCmdPart2() const              { return m_szCmdPart2; };
    HRESULT             GetID() const               { return m_hrCmdID; };
    void                ClearHandle()               { m_pHandle = NULL; };
    BOOL                FIgnoreRsp() const          { return (m_dwOptions & CMDOPT_IGNORERSP); };
    BOOL                FInit() const               { return (m_dwOptions & CMDOPT_INIT); };
    BOOL                FReinit() const             { return (m_dwOptions & CMDOPT_REINIT); };
    BOOL                FHangup() const             { return (m_dwOptions & CMDOPT_HANGUP); };
    BOOL                FDial() const               { return (m_dwOptions & CMDOPT_DIAL); };
    BOOL                FAnswer() const             { return (m_dwOptions & CMDOPT_ANSWER); };
    BOOL                FGeneralInit() const        { return (m_dwOptions & CMDOPT_GENERALINIT); };
    BOOL                FSMSInit() const            { return (m_dwOptions & CMDOPT_SMSINIT); };
    BOOL                FSIMPBInit() const          { return (m_dwOptions & CMDOPT_SIMPBINIT); };
    BOOL                FFinalInit() const          { return (m_dwOptions & CMDOPT_FINALINIT); };
    BOOL                FNoOp() const               { return (m_dwOptions & CMDOPT_NOOP); };
    BOOL                FRequireConnectRsp() const  { return (m_dwOptions & CMDOPT_REQUIRECONNECTRSP); };
    BOOL                CmdOptIsSet(DWORD Flag)     { return (m_dwOptions & Flag); }
    void                SetCmdOpt(DWORD Flag)       { m_dwOptions |= Flag; }
    void                ClrCmdOpt(DWORD Flag)       { m_dwOptions &= ~Flag; }
    DWORD               GetTimeout() const          { return m_dwTimeout; };
    DWORD               GetExecTime() const         { return m_dwExecTime; };
    void                Age()                       { m_dwExecTime /= 2; };
    CNotificationData*  GiveUpNotificationData()    { CNotificationData* pnd = m_pndNotify; m_pndNotify = NULL; return pnd; };
    PFN_CMD_PARSE       GetParseFunc() const        { return m_pfnParse; };
    PFN_CMD_PARSE_DATA  GetParseFuncWithData() const { return m_pfnParseWithData; };
    PVOID               GetParseFnData() const      { return m_pParseData; };
    DWORD               GetPriority() const;
    DWORD               GetRetries() const          { return m_dwRetries; }
    void                SetRetries(const DWORD dwRetries) { m_dwRetries=dwRetries;}
    BOOL                OkToRetry()           { return (m_dwRetries>0) ? (--m_dwRetries,TRUE) : FALSE;}
    APIID               GetAPIID() const             { return m_apiid; };
    BOOL                RetryCommandOnError();

private:
    CRilInstanceHandle* m_pHandle;
    LPSTR               m_szCmd;
    LPSTR               m_szCmdPart2;    
    HRESULT             m_hrCmdID;
    DWORD               m_dwOptions;
    DWORD               m_dwTimeout;
    DWORD               m_dwExecTime;
    CNotificationData*  m_pndNotify;
    PFN_CMD_PARSE       m_pfnParse;
    PFN_CMD_PARSE_DATA  m_pfnParseWithData;
    DWORD               m_dwRetries;
    DWORD               m_dwRetriesOnError;
    DWORD               m_dwRetryOnErrorDelay;
    APIID               m_apiid;
    PVOID               m_pParseData;
};

